package com.csproj.siiat.base.common.util;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.ToDoubleFunction;
import java.util.function.ToIntFunction;
import java.util.stream.Collectors;

/**
 * Created by wjf on 2018/2/2.
 * lambda表达式Stream工具类
 * 简化stream代码
 */
public class StreamUtil {


    /**
     * lambda map
     * @autor wangjf
     * @date 2018年2月2日 17:24
     * @param data
     * @param mapFunc
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T,R> List<R> map(List<T> data, Function<T,R> mapFunc){
        return data.stream().map(mapFunc).collect(Collectors.toList());
    }

    /**
     * 过滤 filter 寻找第一个返回条件
     * @autor wangjf
     * @date 2018年2月2日 17:25
     * @param data
     * @param mapPre
     * @param <T>   未查找到符合条件的返回值
     * @return
     */
    public static <T> T filter(List<T> data, Predicate<T> mapPre, T t){
        return  data.stream().filter(mapPre).findFirst().orElse(t);
    }

    /**
     * 寻找所有符合条件的对象
     * @param data
     * @param mapPre
     * @param <T>
     * @return
     */
    public static <T> List<T> filter(List<T> data, Predicate<T> mapPre){
        return  data.stream().filter(mapPre).collect(Collectors.toList());
    }

    /**
     * mapToDouble
     * @autor wangjf
     * @date 2018年2月2日 17:34
     */
    public static <T> Double mapToDouble(List<T> data, ToDoubleFunction<T> mapFunc){
        return data.stream().mapToDouble(mapFunc).sum();
    }

    /**
     * mapToInt  map t
     * @autor wangjf
     * @date 2018年2月2日 17:34
     */
    public static <T> Integer mapToInteger(List<T> data, ToIntFunction<T> mapFunc){
        return data.stream().mapToInt(mapFunc).sum();
    }

//    public static <T> Integer mapToInteger(List<T> data, ToIntFunction<T> mapFunc){
//        return data.stream().mapToInt(mapFunc).sum();
//    }



}
